Если у вас этот код вызывается в потоке пользовательского интерфейса, то ничего удивительного в этом нет. Вы блокируете обработку очереди сообщений и не даёте контролам даже перерисовать себя.
В "хороших" приложениях блокировать UI не стоит, нужно переносить код в параллельный поток, а оттуда обновлять контролы.
Но в крайнем случае, можно просто периодически давать "просраться" очереди сообщений с помощью Application.DoEvents().