Why is the optimal C chosen by GridSearchCV so small?
Have a look at svc_cv.cv_results_: there are many values of C that tied for best, with accuracy 99.6%, and the chosen C is the smallest of those.  The point is that the width of the margin doesn't affect the actual hyperplane very much, and so the accuracy score doesn't change very much.
A few suggestions:

With larger and less-separable data sets, this might get minimized, since small changes in the hyperplane would be more likely to classify points differently.

For this case, where many scores are exactly equal, you might prefer to tie-break for larger values of C.  This can be easily accomplished by just reversing the order of the list c_space, or more robustly by defining a custom scorer for the search, that takes the mean test score plus some function of C.

Something more refined than accuracy as the scorer for the search could help separate the values for different C, but it's not clear what would be best.  Something like log-loss would require calibrating probabilities; maybe AUROC?