Вы используете Control.Invoke для выполнения практически всего, что означает, что этот код не является многопоточным.
Правильный способ (с участием Backgroundworker) будет использовать событие UpdateProgress для добавления элементов. Это уже синхронизировано.
Но так как вы скрываете элемент управления (или это форма?) Во время этого процесса, вы также можете создать список и по завершении добавить его в список. Этот кусок кода не должен занимать много времени.
Или какая-то комбинация, добавление небольших списков в событие обновления. И я удивляюсь мудрости Hide / Show, я ожидаю, что это просто заставит пользовательский интерфейс мерцать. Оставьте их или замените на SuspendLayout / Resumelayout.