у вас ToString определен как
return String.Format("{0}/{1}", this.numerator, this.denumerator);
в нем используются поля класса
но в конструкторе вы поля класса не заполняете
сейчас 
if (numerator < 0 && denumerator < 0)
            {
                numerator = Math.Abs(numerator);
                denumerator = Math.Abs(denumerator);
            }
            if (denumerator < 0 && denumerator > 0 || denumerator > 0 && numerator < 0)
            {
                numerator = -Math.Abs(numerator);
                denumerator = Math.Abs(denumerator);
            }
должно быть 
if (numerator < 0 && denumerator < 0)
            {
                this.numerator = Math.Abs(numerator);
                this.denumerator = Math.Abs(denumerator);
            }
            if (denumerator < 0 && denumerator > 0 || denumerator > 0 && numerator < 0)
            {
                this.numerator = -Math.Abs(numerator);
                this.denumerator = Math.Abs(denumerator);
            }
Можете помечать приватные поля нижним подчеркиванием, тогда не будете путать их с локальными переменными, например _numerator, _denumerator