En primer lugar, ciertamente es una buena idea poner su modelo en un proyecto separado. Como ha descubierto, esto es trivial.
Con respecto a los controladores y las vistas, no veo ninguna ventaja obvia en separarlos para la mayoría de los proyectos básicos, aunque es posible que tenga una necesidad particular de hacerlo en una aplicación en particular.
Si elige hacer esto, deberá indicarle al marco cómo encontrar sus controladores. La forma básica de hacer esto es proporcionando su propio ControllerFactory. Puede echar un vistazo al código fuente de DefaultControllerFactory para tener una idea de cómo se hace esto. Subescribir esta clase y anular el método GetControllerType (string controllerName) puede ser suficiente para lograr lo que está pidiendo.
Una vez que haya creado su propio ControllerFactory personalizado, agregue la siguiente línea a Application_Start en global.asax para indicarle al marco dónde encontrarlo:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
Actualización: lea esta publicación y las publicaciones a las que se vincula para obtener más información. Vea también el comentario de Phil Haack en esa publicación sobre:
ControllerBuilder.Current.DefaultNamespaces.Add(
"ExternalAssembly.Controllers");
... que no es una solución completa, pero posiblemente lo suficientemente buena para casos simples.