After playing around with this for a long time I found that off of the FaultException object you can create a MessageFault. MessageFault has a property HasDetail that indicates if the detail object is present. From there you can grab the Detail object as an XmlElement and get its value. The following catch block works well.
catch (System.ServiceModel.FaultException FaultEx)
{
//Gets the Detail Element in the
string ErrorMessage;
System.ServiceModel.Channels.MessageFault mfault = FaultEx.CreateMessageFault();
if (mfault.HasDetail)
ErrorMessage = mfault.GetDetail<System.Xml.XmlElement>().InnerText;
}
This yields "Invalid ID." from the sample fault in the question.