Как отмечает Фредерик, List внутренне использует массив. Он создает массив с начальным размером и, по мере добавления дополнительных элементов, если массив заполняется до предела, он копируется в больший массив. Вот почему, если вы заранее знаете, что List будет содержать много строк, это может помочь указать его начальную емкость в конструкторе .
Когда вы удаляете элементы из списка или вставляете в середину, он должен сдвинуть все элементы во внутреннем массиве, чтобы список не был особенно оптимизирован для добавления / удаления многих элементов. Возможно, вам будет лучше использовать LinkedList , который намного более эффективен при операциях добавления / удаления, но дает возможность эффективно получать доступ к элементам в списке по позиции.
Различные коллекции имеют разные реализации, которые лучше всего подходят для определенных сценариев. Для хорошего примера того, как реализованы различные коллекции, я предлагаю проверить библиотеку PowerCollections , выпущенную Wintellect. Многие из коллекций больше не актуальны в .NET 3.5 / 4.0, но они дают некоторое представление о том, как приступить к реализации коллекций.