While I cannot comment on how to code in C#, your issue is most likely due to not writing to these pipes on separate threads.
Named pipes do not buffer the data for you, so your program will be blocked after feeding the pipe until FFmpeg reads ALL the provided data, and your program does not know which one of the pipes FFmpeg currently needs and how many bytes. So, your pipes must be fed completely independently of each other to avoid what you're experiencing.
This will work though. I've successfully implemented it in Python.