You are basically there. I think this is what you want:
RuleFor(x => x.b).GreaterThan(0).When(x => x.a).WithMessage("SomeError1");
RuleFor(x => x.b).GreaterThanOrEqualTo(x => x.c).When(x => !x.a).WithMessage("SomeError2");
So just filter the second rule so it only runs when "a" is false and also add the custom message to each rule.
Fluent validation always runs down all your rules, even if the first one fails, so you need to keep using When() if you want to be selective.
If you have a bunch of rules to validate when a == true, you can use this pattern instead:
When(x => x.a, () =>
{
RuleFor(x => x.b).GreaterThan(0).WithMessage("SomeError1");
RuleFor(x => x.c).LessThan(0).WithMessage("SomeError3");
});