Ok, so after a lot more digging, i found the solution.
The original code was using ExecuteReader. I have changed it to run ExecuteNonQuery.
I pass the same parameters and types in as i did (2 inputs, 2 outputs, one of which is a string, one a refcursor).
When ExecuteNonQuery runs, i can see the value of the 3rd param (the string). then i do the following:
OracleDataReader dr = ((OracleRefCursor)pRefcursor.Value).GetDataReader();
Then i can do my usual loops with the dr! Happy days!