A grandes rasgos, los atributos forman parte de los metadatos, es decir
son un mecanismo para añadir metadatos, como instrucciones de compilación y otros datos sobre tus datos, metodos y clases, para el propio programa que desarrollas.
Los atributos se insertan en los metadatos y son visibles a traves de ILDasm y otras herramientas de lectura de metadatos.
Un atributo es un objetos que representa los datos que quieres asociar a un elemento en tu programa
El elemento al que se refiere un atributo se llama target (objetivo)
Por ejemplo, el atributo [NoIDispatch] esta asociado a una clase o una interfaz para indicar que la clase a la que se refiere (target) debe derivar de IUnknown y no de IDispatch, cuando tratas con COM.
Como ves pueden servir para indicar si una clase deriva de una o de otra, si puede ser visible a traves de COM, que GUID tiene asignado.. en fin... un monton de cosas.. te recomiendo que consultes la ayuda de Visual nET en la categoria de Visual C# and related..y hagas una busqueda de MEtadata and atributtes.
Espero que te haya servido
Ricardo