Reflection optimization for export CSV on large scale
ParseContent()  


Type type = entities.First().GetType(); can throw an exception if entities doesn't contain any items. I may be wrong but you could use the T as well like  Type type = typeof(T);.
If entities is null an ArgumentNullException should be thrown instead of an ArgumentException.  
The foreach could be simplified and you should use a StringBuilder instead of concating strings in a loop. Thats because strings are immutable and for each contentToExport += $"{template}{NewLineDelimiter}"; you create a new string object.  
If the right hand side of an assignment makes the type clear one should use var instead of the concrete type.  
Omitting braces {} althought they might be optional can lead to hidden and therefor hard to find bugs. I would like to encourage you to always use them.  
Having a variable memoryStream doesn't buy you anything. Just return the new memorystream.  


Applying these points will lead to  

public System.IO.Stream ParseContent&lt;T&gt;(IEnumerable&lt;T&gt; entities) where T : class
{
    if (entities == null)
    {
        throw new ArgumentNullException(nameof(entities), "List accepted is empty.");
    }
    if (!entities.Any())
    {
        //assuming thats the desired behaviour
        return null;
    }

    Type type = typeof(T);

    PropertyInfo[] properties = type.GetProperties();

    string headers = GenerateTemplate(properties);

    //No headers accepted - cannot export the content
    if (string.IsNullOrEmpty(headers))
    {
        return null;
    }

    StringBuilder contentToExport = new StringBuilder( $"{headers}{NewLineDelimiter}");

    foreach (T entity in entities.Where(e=&gt;e!=null))
    {

        string template = this.ExportLine(entity, properties);
        contentToExport.Append($"{template}{NewLineDelimiter}");
    }

    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(contentToExport.ToString());

    return new System.IO.MemoryStream(bytes);
}