Q:

Why some C# methods use an object to pass parameters instead of actually passing them directly?

I've seen some C# methods, like ThreadPool.QueueUserWorkItem(WaitCallback, Object), that take a method ("WaitCallback" in this case) but instead of providing an option to directly pass arguments to the method, instead take a separate Object that can supply them.
So you can't do something like is being asked here.
My question is: Why?
There must be a technical reason to use this approach and not allow something like
ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));

private int Multiply(int x,int y)
{
  int z=(x*y);
  return z;
}

A:

Because you want to pass a delegate to WaitCallBack. In simple words, you want to tell WaitCallBack the method the thread has to execute, but you don't want to call that method now.
In your example 
ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));

the method Multiply would be called directly and its result should be passed to the WaitCallback constructor (which isn't possible).
There is no way for the compiler to decide if you wanted to call Multiply here or just want to tell WaitCallback that is has to do that call, because it would be totally the same syntax.
Thatswhy you tell it which method method it should call and - separatly - which argument it should pass when it eventually calls it.

But you could use a lambda instead:
ThreadPool.QueueUserWorkItem(o => Multiply(2, 3));

Now the thread can execute this lambda, which in turn calls Multiply(2, 3) (discarding the argument o).

