I have been plagued with the dreaded OnUserPreferenceChanged Hang that\'s refered to quite nicely by Ivan Krivyakov, here:
http://ikriv.com/en/prog/info/dotnet/Myste
The best guide I've found for resolving this issue is here:
It walks you through using WinDbg to verify the cause of the error and shows you how to find what's causing it. As you mentioned it is most likely caused be a control being created on a non ui thread.
In my case I resolved the issue by creating a factory that uses the SynchronizationContext from the UI thread to create the control and then I call CreateControl() in order to force the creation of a UI handle.
The Microsoft Support article is here: