Здесь вам нужно многопоточность. Это означает, что два (или более) потока кода будут работать параллельно. Одним из них будет поток пользовательского интерфейса, который отвечает за рисование окна. В вашем случае вы выполняете свой код в потоке пользовательского интерфейса и, таким образом, блокируете рендеринг пользовательского интерфейса во время выполнения кода.
Цель BackgroundWorker - запустить операцию в новом потоке, и это то, что вам нужно.