I don't think there are any general resources that would provide you with what you are looking for. Overall, attributes are simply a way of adding metadata to code, without changing that code's behavior. In and of themselves, attributes do not do anything. Attributes let you plug your code into something else, and that other thing can utilize the additional metadata to provide improved functionality.
A couple good examples are the Visual Studio Design Surface, and WCF. Using attributes like [Description], [Category], etc. don't actually do anything to your code...but they do let the Visual Studio designer display and organize your objects properly. Similarly, the [ServiceContract], [OperationContract], [DataContract], [DataMember], and other WCF attributes don't make your code become a web service...they simply make it possible to plug your code into WCF, which in turn makes it a web service.
Attributes are a metadata injection mechanism, and nothing more. Other programs, frameworks, or utilities that USE that metadata are what give attributes their true power. There aren't really any "best practices" about when to use an attribute or not. They are just a tool. They enable you to annotate your code with useful information, and use that information somewhere else. The key is knowing when you need additional metadata...and that is highly subjective...only the person designing the architecture of the project will be able to determine if new custom attributes will be needed.
If you have a specific scenario where you think you need attributes, update you're answer with an example, and I'll see what additional help I can offer.