Devel's dpm needs two refreshes to display message from (pre)process
This is a common issue people encounter when themeing Drupal (it used to drive me crazy).

In basic terms what's happening is that the messages held in the $_SESSION super global have already been committed to the page by the time the template file containing your call to dpm() is invoked.

This means that the messages are added to the $_SESSION but aren't dumped out to the messages area until the next page...as $messages has already been set up for/printed in page.tpl.php.

The normal way to get around this is to invoke the dpm() at an earlier stage of the process, like in hook_page_alter() as you mention, or hook_node_view(), etc.

Also I think if you implement your preprocess hook at the module level, rather than the theme level, that your calls to dpm() will happen in time for the messages to be displayed in that particular page request.