Method that return related entities using OData
GetFull() is a methodname which doesn't tell any caller anything about what the method will do. Please choose always names which are as descriptive as possible.  
this loop  


foreach (var prop in typeof(T).GetProperties().Where(p =&gt; p.GetGetMethod().IsVirtual))
{
    if (prop.PropertyType.IsClass &amp;&amp; !prop.PropertyType.FullName.StartsWith("System."))
    {
        propertyList += prop.Name + ",";
    }
}

propertyList = propertyList.Remove(propertyList.Length - 1);  



could be improved by either using a StringBuilder or by using a ILIst&lt;string&gt; together with string.Join(). This should maybe be extracted to a separate method.  
if (!entities.Equals("0")) you are using entities without doing any null check, so better use if (!"0".Equals(entities)). I usually like positive checks more so I would like to suggest to revert this if..else.  
by default the newed StringBuilder has a capacity of 16 which is doubled if the added value won't fit anymore. So better initialize it with a higher number by using the overloaded constructor which takes the initial size as an argument.
In addition you can take advantage of the fluent methods of the StringBuilder which return the StringBuilder itself.  


All mentioned points (except for the method name) implemented leads to  

public virtual HttpResponseMessage GetFull(int id, string entities)
{            
    string propertyList = string.Empty;

    if ("0".Equals(entities))
    {
        propertyList = GetJoinedPropertyList();
    }
    else
    {
        propertyList = entities;
    }

    string entityName = typeof(T).Name;
    var baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority);
    var response = Request.CreateResponse(HttpStatusCode.Found);

    StringBuilder sb = new StringBuilder(1024);

    sb.Append(baseUrl)
      .Append("/api/")
      .Append(entityName)
      .Append("/")
      .Append(id)
      .Append("?$expand=")
      .Append(propertyList);

    response.Headers.Location = new Uri(sb.ToString());
    return response;
}
private string GetJoinedPropertyList()
{
    IList&lt;string&gt; propertyNames = new List&lt;string&gt;();

    foreach (var prop in typeof(T).GetProperties().Where(p =&gt; p.GetGetMethod().IsVirtual))
    {
        if (prop.PropertyType.IsClass &amp;&amp; !prop.PropertyType.FullName.StartsWith("System."))
        {
            propertyNames.Add(prop.Name);
        }
    }
    return string.Join(",", propertyNames);
}