proper structure of classes using interface classes Given the following two interfaces what would the proper way to set up the two actual classes?

public interface IPortfolio
{
    string FirstName { get; set; }
    string LastName { get; set; }
    string Name { get; set; }
    int Id { get; set; }
    List&lt;IDocument&gt; Documents { get; set; }
}
public interface IDocument
{
    string ExtensionType { get; set; }
    int Id { get; set; }
    DateTime? DateFiled { get; set; }
    int? Size { get; set; }
    int? SortOrder { get; set; }
}


The actual classes:

 public class Portfolio : IPortfolio
{
    public Portfolio()
    {
        Documents = new List&lt;IDocument&gt;();
    }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Name { get; set; }
    public int Id { get; set; }
    public List&lt;IDocument&gt; Documents { get; set; }
}

public class Document : IDocument
{
     public Document()
     {
       Pages = new List&lt;IPage&gt;();
     }
     public string ExtensionType { get; set; }
     public int Id { get; set; }
     public DateTime? DateFiled { get; set; }
     public int? Size { get; set; }
     public List&lt;IPage&gt; Pages { get; set; }
     public int? SortOrder { get; set; }
}


When using the code above I get an error about not being able to implicitly convert List&lt;Document&gt; to List&lt;IDocument&gt;

This is a learning project to understand the concept of Interfaces and how they should best be used.
There no such thing like an interface class (term used in initial version of post). You have interfaces and classes implementing the interfaces.

I don't see any List&lt;Document&gt; in your code, but If you have defined the list as List&lt;IDocument&gt;, you must stick to this definition. You cannot assign it a List&lt;Document&gt;. But you can add Document objects to this list.

Generally two types T&lt;A&gt; and T&lt;B&gt; are not assignment compatible, even if A and B are assignment compatible. An exception is when the in or out keywords are used in generic interfaces. But this can only be done if the generic type occurs exclusively as input or exclusively as output as explained in Variance in C#.NET 4.0 Covariance and Contravariance.

I would convert the list properties Documents and Pages to getter-only properties.

public interface IPortfolio
{
    string FirstName { get; set; }
    string LastName { get; set; }
    string Name { get; set; }
    int Id { get; set; }
    List&lt;IDocument&gt; Documents { get; }
}


And create the class like this

public class Portfolio : IPortfolio
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Name { get; set; }
    public int Id { get; set; }
    public List&lt;IDocument&gt; Documents { get; } = new List&lt;IDocument&gt;();
}


This makes the Documents property read-only. The list itself remains read/write.

var portfolio = new Portfolio();
portfolio.Documents.Add(new Document());