Para garantir que os controles ASP.NET gerem xHTML válidos depois de compilados é simples. Basta adicionar o código abaixo no web.config que o ASP.NET será validado pela W3C:
<system.web>
<xhtmlConformance mode="Strict"/>
<browserCaps>
<case match="W3C_Validator*">
TagWriter = System.Web.UI.HtmlTextWriter
W3CDomVersion = 1.0
</case>
</browserCaps>
</system.web>
Para XHTML 1.0 Strict, usa-se:
<xhtmlConformance mode="Strict"/>
browserCaps: já tive alguns problemas de BORDER="0" ao validar na W3C, mas no meu código fonte não tinha nada disso. Então para resolver o problema de BORDER="0" usei o browserCaps:
<browserCaps>
<case match="W3C_Validator*">
TagWriter = System.Web.UI.HtmlTextWriter
W3CDomVersion = 1.0
</case>
</browserCaps>
Este é um artigo que teve o intuito de ajudar os desenvolvedores que muitas vezes quebram a cabeça para validar ASP.NET na W3C.
Você pode ver mais artigos que falam sobre segredos configurações importantes do Web.Config clicando aqui.