About events usage I would write a post but really is hard because what you can do and what you can't do is really long to explain.
NH's events are not as common events in .NET... In .NET you may have a class doing something and raising events for some actions.
NH's events are NH itself; all the persistent work is done through listeners and for that reason who write a listener should know how NH work/think.
I saw some issue, reported as bug, about collection initialization... well a collection shouldn't be initialized inside a listener because not initialized collection will not be processed. If you initialize a collection during Flush, for us, something wrong happened in NH and not in your custom event. If you really want do it you should override the listener where NH is checking de collection state during flush and not only a Pre* listener.