Display logic/responsibility falls on view's shoulders, so...
If rules are dependent on e.g. user permission and are applicable to all of the controls then I'd say one enum per viewmodel would be enough.
Otherwise your're doing it ok. The only thing I would change is I would write custom extension methods for displaying viewmodel properties.
Something along these lines:
public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, DisplayMode mode)
{
// put a switch statement here to either
// add html attribute for readonly
// or
// return null/emptystring
}
With this extension your view could have @Html.TextBoxFor(x => x.Prop, Model.PropMode)
That would clean your razor views a bit.
Also keep in mind that readonly field values could be still altered (dev tools, firebug). That's something to take care of in your HttpPost action.