Если вы не возражаете отложить реализацию, чтобы разумно реализовать свойство Description, вы можете просто сделать
public abstract string ClassDescription {get; }
// ClassDescription is more intention-revealing than Description
И реализация классов будет делать что-то вроде этого:
static string classDescription="My Description for this class";
override string ClassDescription { get { return classDescription; } }
Тогда ваши классы должны следовать договору о наличии описания, но вы оставляете это им делать это разумно. Нет способа указать реализацию объектно-ориентированным способом (кроме как через жестокие, хрупкие хаки).
Однако, на мой взгляд, это Описание является метаданными класса, поэтому я бы предпочел использовать механизм атрибутов, как это описали другие. Если вас особенно беспокоит многократное использование отражения, создайте объект, отражающий атрибут, который вас интересует, и сохраните словарь между типом и описанием. Это сведет к минимуму отражение (кроме проверки типа во время выполнения, что не так уж и плохо). Словарь может храниться как член любого класса, который обычно нуждается в этой информации, или, если это требуется для клиентов по всему домену, с помощью одноэлементного или контекстного объекта.