В настоящее время вся ваша обработка выполняется в основном потоке (UI), поэтому вся обработка должна завершиться до того, как поток UI получит свободные циклы для перекраски UI.
У вас есть 2 способа преодолеть это. Первый способ, который не рекомендуется, это использовать
Application.DoEvents();
Запускайте это всякий раз, когда вы хотите, чтобы очередь сообщений Windows обрабатывалась.
Другой рекомендуемый способ: создать другой поток для обработки и использовать делегат для передачи обновлений пользовательского интерфейса обратно в поток пользовательского интерфейса. Если вы новичок в многопоточной разработке, попробуйте BackgroundWorker.