I don't have a strong opinion on this, so if you prefer the list approach that's fine with me. I'm not sure `brian_prefs_unvalidated` should be a module attribute, though -- shouldn't it rather be an attribute of the `BrianGlobalPreferences` object? Actually, why not put the preference registry and the `register_preferences` and `do_validation` functions into the class as well?
> Like this Network.run can just check if len(brian_prefs_unvalidated) then warn.

I think this should be taken care of in `BrianGlobalPreferences` (regardless of the details of the approach), e.g. it should provide a `has_unvalidated_prefs()` method. Or, maybe even better just a `check_for_unvalidated_prefs()` so it is itself responsible for the warning/error message (makes it easier to configure). 

A last point: The check for unvalidated preferences only works for preferences defined in files, e.g. if I'm doing:

    brian_prefs['core.weave_compilr'] = 'icc' # note the typo
    brian_prefs['core.weave_compiler'] = 5 # illegal value

the preference will not be added to `brian_prefs_unvalidated` and no warning will be raised (but my approach described above would fail here as well...)