We have a similar requirement, and, while it hasn't been fully implemented yet, we've got some architecture for the main functionality elements.
Basically, you'll want to look at a basic plugin architecture. Create interfaces for each of the elements that you want dynamically loaded (menus, commands, reports, etc). Then use reflection to load the assemblies in a given directory and scan for implementations of those interfaces. Use some sort of hash to check whether a given assembly can be loaded based on the license, and ensure that each of your major functionality groups (modules) are separated into different assemblies.
Encapsulate each of the core functions ("New Journal Entry", "New Invoice", etc) into some form of "process object", and you should be able to attach security information to it, including whether or not the license allows the command to be executed. This will also give you the beginnings of the Command Pattern.
Hope that helps.
Jeff...