The problem is that Java does not support unsigned datatypes, while .NET does.
Unsigned byte is from 0 to 255. This is .NET Byte struct
Signed byte is from -128 to 127. This is Java byte primitive datatype or .NET SByte struct.
The data in .Net code stores the iv as unsigned values, while Java code does not allow you to do it directly.
Solutions:
1) You could just manually subtract 128 from each byte in .NET code, thus making it to represent the same bit pattern(IV is just sequence of bits - it does not matter whether they stored as signed or unsigned values - it is the bits that must match):
byte[] iv = new byte[] { -8, 81, ...};
2) Or you could store the same data in an int datatype array and convert them to byte values using the following code.
int[] ivInInts = new int[] { 116,209,63,154,85,66,37,82,96,104,131,192,103,140,125,176 };
byte[] iv = new byte[ivInInts.getLength()];
for (int i = 0; i < ivInInts.getLength(); i++)
iv = (byte)(ivInInts[i] - 128);
EDIT:
If you have some doubts about binary equivalence of numbers you could read about two's complement numbers:
65 = 0100 0001 as unsigned byte = 0100 0001 as signed byte
-65 = cannot be represented as unsigned byte = 1011 1111 as signed byte
193 = 1011 1111 as unsigned byte = cannot be represented as signed byte