It looks like your implementation relies on
Width.CompareTo(second.Width) to return either 1, 0, or -1.
This assumption is wrong. If
first.Length is greater than
CompareTo is allowed to return 9999, or 1, or 500. These could very well screw up your additions.
Sure, the current .NET implementation returns either 1, 0, or -1, but that's an implementation detail. Furthermore, other C# implementations or even future version of .NET may return other values.
Also, tricks reduce readability.
A correct implementation would be:
var widthComparison = first.Width.CompareTo(second.Width);
if(widthComparison == 0)
else return first.Length.CompareTo(second.Length);
But instead of fixing your implementation, I would suggest using LINQ's
ThenBy instead. It doesn't seem like you need to sort the list in-place, so there's no need to reinvent the wheel.
List<Thing> things = thingsDictionary.Select(thing => thing.Value)
.OrderBy(x => x.Width)
.ThenBy(x => x.Length)