Не уверен, что это лучший способ, я бы сделал пользовательский серверный элемент управления текстовым полем,
затем переопределите метод рендеринга, проверьте, доступен ли он только для чтения,
если это только для чтения, то визуализируйте ваши теги span, как это делает элемент управления label.
если нет, то пусть рендеринг базы (текстового поля) вступит во владение ...
public class SpecialTextbox : TextBox
{
public override void RenderControl(HtmlTextWriter writer)
{
if (!this.ReadOnly)
{
base.RenderControl(writer);
}
else
{
writer.Write(string.Format("<span id=\"{0}\" class=\"{1}\">{2}</span>",
this.ClientID,
this.CssClass,
this.Text));
}
}
}