As of C# 4, When using generics, you have to explicitly tell the compiler that a generic type may be of a more derived type (covariant) using the out keyword inside your generic parameter definition:
http://msdn.microsoft.com/en-us/library/dd469487.aspx
public interface Subject<out TCourse> where TCourse : Course
{
int SubjectId { get; set; }
string Name { get; set; }
IEnumerable<TCourse> Courses { get; set; }
}