It is 100 percent your cs, you did everything else right. Its too low for that long of a game. Did you steal JG camps? That's a biggie.
Don't get me wrong, I agree with you should get an S, does it matter if you didn't hit enough creeps if you killed all the enemies so your team could push objectives unopposed? Riot feels you are in the wrong in that scenario and yeah their answer DOES boil down to "GIT GUD SON" and its bullshit and it sucks.
While its true that CS is ALOT of what separates top tier players from lower tiers, in this scenario they reaaaaally should throw you a bone since a player like you would have to basically stop participating in team fights and objectives to go AFK farm waves and the jg for a good 5 min or so just to boost your cs to the 250/275 that would have given you an S and encouraging that kind of behavior is just plain dumb on their part. I mean that level of kill and objective participation with 0 deaths should really get you there alone, but don't count on Riot to ever be nice.
My advice, the easiest way to S is to play something support that has no business doing it, and just do decent (or play a support in another role, same concept, play something out of its lane/role). Baring that, look for champs with very low playrates, but decent winrates in their role, since S is "supposedly" based on the average of the best players, a smaller sample size means less harsh grading. Illaoi is currently number 11 in play percent out of 52 champs top according to champion.gg so the sample size is HUGE and grading is gonna be harsh like you just experienced.
Edit: Just noticed what another player said about Control wards and yeah that helps alot. ALWAYS have one on the map if you can if you are going for an S, they really care about that one.