Since you are talking about features rather than plug-ins, I suggest you look at using AuthorizeAttribute with roles to control access to each feature and/or feature set.
public class FeatureController : Controller
{
[Authorize(Roles = "Feature1")]
public ActionResult Feature1()
{
// Implement feature here...
return View();
}
[Authorize(Roles = "Feature1")]
[HttpPost]
public ActionResult Feature1(Model model)
{
// Implement feature here...
return View();
}
[Authorize(Roles = "Feature2")]
public ActionResult Feature2()
{
// Implement feature here...
return View();
}
// Other features...
}
Then any user who is in the Feature1 role will have access to Feature1, the Feature2 role will have access to Feature2, etc.
You could combine AuthorizeAttribute with MvcSiteMapProvider's security trimming feature to make menu items that are only visible when the user is in the appropriate role.
Full Disclosure: I am a major contributor of MvcSiteMapProvider.
IEnumerable<addons>that you populate in the controller based on the customer ID, then use a loop in the view to display them