I think I found your error in the code to fix one of the characters not putting their shield back on.
Code:
shield2 = inventory1.GetSlot(Constants.SlotNumber.Right).Id
changed inventory1 to inventory2
I looked through your source and I noticed you were just using timers and checking the players health to determine when to replace the shield but you have to take into account that there will be a rat, or bug or some creature also attacking these players so you can see where this would cause a problem.
My suggestion would be to first of all use one character to determine when the other character gets a blood hit on them and if a blood hit hasn't been reported from the other character in the last 25 seconds then remove the armor items one piece at a time until a blood hit is received.
You might also look into changing the players attack stance while trying to get a blood hit.
I hope you can understand what I'm trying to say.