Reversing each word of a string while keeping the case index
If you aim for fewer lines of code, you could of course put everything into a single line, but that would not helpful at all. 

However, you could shorten your code a bit by using a simple regular expression and some linq-fu, something like:

var s = yourInputString;

// split string into words
var splitted = Regex.Split(s, @"(\W)").Select(r =&gt; r.AsEnumerable()).ToArray();

// reverse each word
var reversed = splitted.Select(sp =&gt; sp.Reverse().ToArray());

// adjust case
var zipped = splitted.Zip(reversed, (a, b) =&gt; string.Join("", a.Select((c, i) =&gt; char.IsUpper(c) ? 
                                                                                 char.ToUpper(b[i]) : 
                                                                                 char.ToLower(b[i]))));

// join back to string
var result = string.Join("", zipped);


I would not care about performance in this case, because it would be pointless. 

Also, reversing a string with Reverse().ToArray() will corrupt your string if it contains surrogate characters, but this is probably out of scope of your task.