This behavior is covered in section 3 of the C# language specification. Here is the quote from the spec
Similarly, any expression that
occurs as the body of an anonymous
function in the form of a
lambda-expression creates a
declaration space which contains the
parameters of the anonymous function.
It is an error for two members of a
local variable declaration space to
have the same name. It is an error for
the local variable declaration space
of a block and a nested local variable
declaration space to contain elements
with the same name. Thus, within a
nested declaration space it is not
possible to declare a local variable
or constant with the same name as a
local variable or constant in an
enclosing declaration space.
I think the easier way to read this is that for the purpose of variable declaration (and many other block related functions) a lambda/anonymous delegate block are treated no different than a normal block.
As to why the the language was designed this way the spec does not explicitly state. My opinion though is simplicity. If the code is treated as just another block then it makes code analysis routines easier. You can preserve all of your existing routines to analyze the block for semantical errors and name resolution. This is particularly important when you consider variable lifting. Lambdas will eventually be a different function but they still have access to all in scope variables at the declaration point.