Currently, all of your processing is being performed on the main (UI) thread, so all processing must complete before the UI thread then has free cycles to repaint the UI.
You have 2 ways of overcoming this. The first way, which is not recommended, is to use
Application.DoEvents();
Run this whenever you want the Windows message queue to get processed.
The other, recommended, way: Create another thread to do the processing, and use a delegate to pass the UI updates back to the UI thread. If you are new to multithreaded development, then give the BackgroundWorker a try.