Could anyone say if this is a reliable shuffling code?
your code is pretty neat and readable. Shuffling algorithm looks reliable to me, however I have a few comments to your C# code.


You pass the argument numberOfTries as ulong type, but correctHits and wrongHits are int. It could lead to wrong output if the numberOfTries is large enough to overflow int.MaxValue.
Variable doors are initialized in each loop. It could be initialized once in higher scope, e.g. before the for loop.
I can see repetetive code doors[prizeIndex.Next(0, doors.Length)]. This piece of code could be refactored to isolated method. For example:

private static int GetDoorNumber() => _doors[_prizeIndex.Next(0, _doors.Length)];
You can save couple of code lines introducing ternary operator. Then you do not need variable correctGuess.

correctHits += (selectedDoor == prizeDoor) ? 1 : 0;


You can calculate wrongHits as a difference of numberOfTries and correctHits. But your solution works too.