Returning a more specific class
Dreza has outlined the correct approach (the same used in IComparable&lt;T&gt;). You can make your class generic, with a type constraint:

public abstract class TraktQuery&lt;TResponse&gt; where TResponse : TraktResponse


And change every occurence of TraktResponse to TResponse:

protected abstract TResponse ParseResponse(string response);


and

public TResponse PerformQuery()
{
    //...
}


Then, your deriving class can be defined as

public class TraktQueryEpisodeSummary : TraktQuery&lt;TraktResponseEpisodeSummary&gt;
{
    //...
    protected override TraktResponseEpisodeSummary ParseResponse(string response)
    {
        //...
    }
    //...
}


Voila, no cast necessary: 

TraktResponseEpisodeSummary summary = query.PerformQuery();




Further suggestions:


Use collection and object initializers, for instance in the overridden QueryParameters:

 return new List&lt;string&gt; {_showName, _season.ToString(), _episodeNumber.ToString()};

Or turn them into an IEnumerable&lt;string&gt; and use an iterator block:

protected override IEnumerable&lt;string&gt; QueryParameters
{
    get
    {
        yield return _showName;
        yield return _season.ToString();
        yield return _episodeNumber.ToString();
    }
}

Be careful when concatenating strings to form a URL like this:

string url = baseUrl + QueryUrl + "/" + apiKey + "/" + string.Join("/",QueryParameters);


It might be better to


Use the Uri and/or UriBuilder class
Put the first three parts into an sequence, then call IEnumerable&lt;T&gt;.Concat and finally string.Join
There's probably some even better options.