Xorgens4096 PRNG with global seeder in C#
The only thing I see that needs correcting is the locking.  Remember that 

lock (hash) {
    // body
}


is syntactic sugar for:

var local = hash;
try
{
    System.Threading.Monitor.Enter(local);
    // body
}
finally
{
    System.Threading.Monitor.Exit(local);
}


When you update the hash variable in one thread, the next thread to come in will have a different object that it locks, and so the blocks will execute in parallel.  It's usually a mistake to try to reuse part of your model as a lock.  I always recommend a dedicated object like

static readonly Object _lock = new Object();


Other than that, I only suggest:

if (String.IsNullOrEmpty(seed) == false)


should be:

if (!String.IsNullOrEmpty(seed))