Стандартный элемент управления ListView имеет виртуальный режим , разработанный специально для вашей ситуации. Ранее я использовал его со списком миллионов строк, и он хорошо справляется со своей работой.
Это настоящий виртуальный режим. Другими словами, выделение памяти и время заполнения списка остаются низкими, независимо от размера общего списка. Это не похоже на DataGridView, который действительно начинает замедлять и использовать память в больших списках.
Для использования виртуального режима установите:
VirtualListMode = true
VirtualListSize= 300000
(или любой другой размер вашего списка)
Затем обработайте событие RetrieveVirtualItem, чтобы заполнить список по требованию из вашего списка. Вам также может понадобиться обработать события CacheVirtualItems и SearchForVirtualItem.