I understand that if I cast it to a named type I can do whatever I want with it, but it'd make for much tidier code if I could keep the anonymity between method calls.
If you really want to be an asshole, you can do this: http://msmvps.com/blogs/jon_skeet/archive/2009/01/09/horrible-grotty-hack-returning-an-anonymous-type-instance.aspx
... But please don't!
Think of the signature of your method as a contract. Your method says "I promise to return you something that contains the following fields." If you return an anonymous object from your method, there's no contract. You're just saying "There's some data here, good luck!"
If C# 4 is at all an option, you can just use tuples to return somewhat more arbitrary data.
This is a guess...but I'm so "awesome" I'm "sure" I'm right...
Anonymous types really aren't "anonymous." The class that represents the unknown type is generated at run-time local to the method call on the run-time stack(hence the method-only scope). Returning from the function call(popping the stack) you lose all the objects in that scope including the anonymous class that was hiding on the stack with that method call.
Guessing over...