Хорошо ... если привязка не вариант - и я бы, вероятно, пошел бы так, если бы это было ... тогда единственный более эффективный способ заполнить список - это сделать это параллельно.
(Чтобы это работало, я предполагаю, что у вас есть среда выполнения .Net 4 или установлены библиотеки PLinq)
Следующий код продемонстрирует значительные улучшения на многоядерном компьютере, при условии, что сбор данных будет достаточно большим, чтобы оправдать издержки начальной настройки. Так что это было бы целесообразно только для больших массивов.
Parallel.ForEach(list, r => destinationList.Items.Add(r));
Иначе я не вижу ничего плохого в вашем цикле foreach.