Firstly, I think you should be more polite.
Secondly, your example could use easier numbers.
Thirdly, you have not explained what bit is wrong.
Teh1337Bix: formula
Matrix transform = Matrix.CreateRotationZ((float)Math.Atan2(endToBall.Y, endToBall.X));
Vector2 newSpeed = Vector2.Transform(ballSpeed, Matrix.Invert(transform));
newSpeed X ends up to = negative ballSpeed.Y and newSpeed Y = -3.351213E-07.
I have looked at that calculation and without spending too long checking, it looks correct.
Atan2... with your numbers gives a -90 deg rotation, as you have stated (-half PI.)
You create a matrix that rotates -90 deg about the Z axis.
You invert it, so that's plus 90 deg about the Z axis, (I think.)
So you rotate a vector facing upwards (your ballSpeed), 90 deg about the plane that faces in to the screen, giving you a vector lying horizontal. Y = 0 (ignoring floating point error) and X = what your Y value was (ignoring the sign.)
The only thing I can see that could make a difference is if you swap the X and Y values in the Atan2 function, you'd get a completely different result.
**
Well on the way to creating a 3D First person controls shooter with Over the Shoulder view... Another few YEARS and it'll be done!
http://games.discoverthat.co.uk/ - Skinning Sample Dude for Blender and XNA Parallel Spilt Shadow Maps plus other stuff...
My game development blog - Well a few notes from time to time...