ZigZag tree travesal
The algorithm seems okay so I'll review the OOP aspect.
Naming

The method named PrintBinaryZigZag but it doesn't print anything.
The class named BinaryTree isn't really a binary tree, it's more of a Node.

Implementations vs interfaces
You return List&lt;int&gt;, but do you really need a list?
The goal of this method if to return a list that represents a binary tree.
Should you be able to add/remove objects from this list? Do you need the indexer, that is specific to the list? I don't think so. In this case, return IEnumerable&lt;int&gt;.
C# details
BinaryTree temp = currentLevel.Peek();
currentLevel.Pop();

You could simply do : BinaryTree temp = currentLevel.Pop();
Flow
if (leftToRight)
{
    if (temp.Left != null)
    {
        nextLevel.Push(temp.Left);
    }
    if (temp.Right != null)
    {
        nextLevel.Push(temp.Right);
    }
}
else
{
    if (temp.Right != null)
    {
        nextLevel.Push(temp.Right);
    }
    if (temp.Left != null)
    {
        nextLevel.Push(temp.Left);
    }
}

I'm sure there's a way to make this smaller. Now, this is a take to maybe give you an idea, I don't think it's perfect, it's weird to use a foreach when you only have two elements in the list. But maybe if can give you an idea to make this code smaller.
var orderedNodes = leftToRight ? new []{ temp.Left, temp.Right } : new []{ temp.Right, temp.Left };

foreach(var node in orderedNodes.Where(n =&gt; n != null)) 
{
    nextLevel.Push(node);
}

This :
if (currentLevel.Count == 0)
{
    leftToRight = !leftToRight;
    Stack&lt;BinaryTree&gt; tempStack = currentLevel;
    currentLevel = nextLevel;
    nextLevel = tempStack;
}

I think it could be outside your while loop.