If you add .NET 3.0 attributes to an assembly, then run this on a machine with .NET 2.0 only, this amounts to having an attribute on your code from an assembly that is unavailable at runtime.
This will mostly work fine as long as the .NET 2.0 application doesn't actually attempt to read the attributes. For example, the following code will throw a FileNotFoundException because it will fail to load System.ServiceModel.dll if run on a machine with .NET 2.0:
[ServiceContract] // Attribute from System.ServiceModel.dll
class MyClass
{
...
}
...
// this will throw a FileNotFoundException if System.ServiceModel.dll is not available
object[] attributes = typeof(MyClass).GetCustomAttributes(false);
Therefore if you don't know who will be consuming your class library, you can't guarantee 100% that you won't break them.
The above can be avoided by shipping a copy of System.ServiceModel.dll (or other assembly containing attributes you're using) with your application, or (I think) by using the overload of GetCustomAttributes that takes a System.Type argument, so you only read attributes that are known to be available.