Прежде всего, это хорошая идея - поместить вашу модель в отдельный проект. Как вы обнаружили, это тривиально.
Что касается контроллеров и представлений, я не вижу очевидного преимущества в их разделении для большинства базовых проектов, хотя вам может потребоваться сделать это в конкретном приложении.
Если вы решите сделать это, то вам нужно будет сообщить платформе, как найти ваши контроллеры. Основной способ сделать это - предоставить свой собственный ControllerFactory. Вы можете взглянуть на исходный код DefaultControllerFactory, чтобы понять, как это делается. Подтипа этого класса и переопределения метода GetControllerType (string controllerName) может быть достаточно для выполнения того, что вы просите.
После того, как вы создали свой собственный ControllerFactory, вы добавляете следующую строку в Application_Start в global.asax, чтобы сообщить платформе, где его искать:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
Обновление: Читать это сообщение и сообщения, на которые он ссылается для получения дополнительной информации. Смотрите также комментарий Фила Хаака к этому посту о:
ControllerBuilder.Current.DefaultNamespaces.Add(
"ExternalAssembly.Controllers");
... который не является полным решением, но, возможно, достаточно хорош для простых случаев.