Как очистить память, занятую списком C#?
Убрать все ссылки на него, а потом сделать GC.Collect
По идее, вы не должны заморачиваться сборщиком мусора. 
Он сам знает когда ему проверить, есть ли неиспользуемые объекты и сам их очистит.
Если будете часто его вызывать, в частности GC.Collect, это замедлит работу вашего приложения.
И еще, если у вас 20млн строк - то лучше используйте IEnumerable и работаете с ограниченным количеством строк - постранично к примеру. Тогда проблем с памятью не будет.