So turns out I need to pass my Ruleset through in the constructor of the ObjectValidator attribute as well as specifying the Ruleset property to get my expected behaviour.
public class Person
{
[ObjectValidator]
[ObjectValidator("A", Ruleset = "A")]
public Address Address { get; set; }
}
public class Address
{
[StringLengthValidator(0, 32, MessageTemplate = "Invalid value '{0}' for {1}, Max length:{5}")]
public string Address1 { get; set; }
[StringLengthValidator(0, 32, MessageTemplate = "Invalid value '{0}' for {1}, Max length:{5}", Ruleset = "A")]
public string Address2 { get; set; }
}
Basically the constructor argument is the target ruleset in the target object ("Address") while the Ruleset named parameter is what the ruleset is called on the current object ("Person").