Your code seems to be correct. Check the <form>
sent to the server. There most likely would be doubled name HtmlAttributes[0].Value
...
<input name="HtmlAttributes[0].Value" ...
<input name="HtmlAttributes[0].Value" ...
That ends up with the not a signle but multiple value ... i.e. System.String[]
EDIT: the issue is
Change the public IDictionary<string,object> HtmlAttributes { get; set; }
into
IDictionary<string,string> HtmlAttributes { get; set; }
The value must be of type string to force ModelBinder to correclty covnert raw value