I have a similar extension method that creates a watermark textbox that works correctly. Give it a shot to see if it fixes your issue. Also take a look at the ModelMetadata instance to see if it is getting created correctly.
public static MvcHtmlString WatermarkTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData);
string watermark = !String.IsNullOrEmpty(metadata.Watermark) ? metadata.Watermark : metadata.DisplayName;
var attributes = htmlHelper.MergeAttributes(htmlAttributes, new { placeholder = watermark });
return htmlHelper.TextBoxFor<TModel, TProperty>(expression, attributes);
}