If you are fine with calling Application.DoEvents and it works, then that is surely one approach. However, in my experience, Application.DoEvents is most always a hack and rarely a good idea.
My first thought, is perhaps you can create a background thread which generates your images. Begin your thread and show your modal dialog. For your thread, after it's created a certain amount (e.g. 5, 10, 20, 50, whatever), it would Invoke to the event dispatcher and execute a method which updates the ListView with the new batch of Images. Because it was only invoking periodically it would give the Modal Dialog time to process messages of its own. The function which you invoke on the event dispatcher would receive a list of images, Call ListView.BeginUpdate(), Loop through the list and create and add items, then call ListView.EndUpdate()
There's other ways you can do this, but I would really try to avoid Application.DoEvents() (which in my experience is a hack coming from Visual Basic programmers who did not understand threading).