Int32.Parse(FinishSorce.GetValue(i, j).ToString() - to jest jakiś potworek, którego do tego wykonujesz o wiele razy za dużo. Wykonaj to raz, przypisz wynik do zmiennej, po tym sobie rób warunki. Musi to w ogóle przechodzić przez stringa? jeśli masz to w postaci tekstu to wystarczy odjąć od bajta bodajże 48 i masz wartość liczbową, będzie ciut szybciej.
FinishSorce.GetLength(1) to też wykonujesz przy każdym przejściu pętli, a podejrzewam że wynik się nie zmienia - przypisz
@Smoczers: Kilka błędów, głównie stylistycznych nie optymalizacyjnych - ten switch to masz jest kompletnie useless, powinien być zależny od byte[] I4 = { 63, 127, 191, 255 }; jako że i tak masz 1 wartość w górnym switchu.

masz co prawda else if ale logicznie ify są spełnione dla iluś warunków, dla wartość 63 masz np spełnione dwa ify choć i tak odpali się jeden, po prostu taka zbędna rozbieżnośc logiczna.