Permutation function in C#
To answer your (1) yield return in a recursive method ... Eric Lippert does it in Producing Permutations series, Part Three , specifically in his HamiltonianPermutationsIterator recursive method.

I won't dive into your (2) only to suggest that perhaps you read all of Eric Lippert's series to learn more.

Braces Need Improving

On coding style, your use (or lack thereof) of braces could be improved.  The C# convention is to put the opening brace on a new line (this differs from Java).

More importantly is that you lack braces on so many one-liners.  This is heavily discouraged.

I would suggest cleaning your code to change a snippet from this:

if (r &gt; 1) {
    list.Swap(startPos, i);
    foreach (var permute in GetPermutations(list, r - 1, startPos + 1))
        yield return new List&lt;T&gt;().AddRange(list[startPos].AsEnumerable(), permute);
    list.Swap(startPos, i);
} else
    yield return new List&lt;T&gt;() { list[i] };


To this:

if (r &gt; 1) 
{
    list.Swap(startPos, i);
    foreach (var permute in GetPermutations(list, r - 1, startPos + 1))
    {
        yield return new List&lt;T&gt;().AddRange(list[startPos].AsEnumerable(), permute);
    }
    list.Swap(startPos, i);
} 
else
{
    yield return new List&lt;T&gt;() { list[i] };
}


Swap Method

You really don't do anything with the bool returned from the Swap method.  Plus I see little reasoning in not swapping 2 values that happen to be equal.  This method could simply be void.

You are also encouraged to have meaningful names in C#, so i1 would be better named as index1.  Ditto for i2.

public static void Swap&lt;T&gt;(this IList&lt;T&gt; list, int index1, int index2) 
{
    var temp = list[index1];
    list[index1] = list[index2];
    list[index2] = temp;
}