Ok tj
Couple of things.
First:
When you are sending a List or an Array or a coma delimited String as a payload without providing custom splitter, such message will be considered already split and the only thing that AbstractMessageSplitter will do is to assign the correlation-key, sequence-size and sequence numbers. So you were essentially sending an already split message.
So send one message at the time in the loop.
You can still nest the aggregators and send a list as before which will be naturally split as before on individual messages and then each individual message will be split again. This way you can treat your initial payload as batch which could be aggregated later on as well, but we won't go there just yet.
Second:
Based on your code I believe your intention was to send a Deposit to two different consumers, receive the replies from both (Receipt) and aggregate them into a single message which itself is going to be the aggregate of 2. A pretty standard use case for which you had much more code then you needed 
So here is the modified XML configuration;
Code:
<si:gateway id="bankingGateway"
service-interface="com.mycompany.si.BankDemo$BankingGateway"
default-request-channel="deposits"/>
<si:channel id="deposits" />
<si:channel id="receipts" />
<si:splitter id="splitter"
input-channel="deposits"
output-channel="depositRouter"
expression="T(java.util.Collections).nCopies(2, payload)"/>
<si:recipient-list-router input-channel="depositRouter">
<si:recipient channel="bankingServiceChannel" />
<si:recipient channel="bankLogChannel" />
</si:recipient-list-router>
<si:aggregator id="aggregator" input-channel="storedReceipts" />
<bean name="aggregateReceipts" class="com.mycompany.si.service.ReceiptAggregate" />
<si:service-activator ref="bankingService" method="deposit"
input-channel="bankingServiceChannel" output-channel="storedReceipts" />
<si:service-activator ref="bankLogService" method="log"
input-channel="bankLogChannel" output-channel="storedReceipts" />
<bean id="bankingService" class="com.mycompany.si.service.BankingService" />
<bean id="bankLogService" class="com.mycompany.si.service.BankLogService" />
Notice how simpler the splitter has become by using Spring Expression language where I am simply calling nCopies(..) method which multiplies payload by 2 (essentially splitting/duplication it)
Also, the case of aggregation is very standard (based on correlationId and sequenceSize so you don't need to provide any customization.
... and Test Case
Code:
public class BankDemo{
@Test
public void testListOfDepositsReturnListOfSummaries(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"com/mycompany/si/config/springIntegration.xml");
BankingGateway bankingGateway = context.getBean("bankingGateway", BankingGateway.class);
List<Deposit> deposits = new ArrayList<Deposit>()
{
{
add(new Deposit(25.0, "1"));
add(new Deposit(50.0, "2"));
}
};
for (Deposit deposit : deposits) {
Object result = bankingGateway.processDeposits(deposit);
System.out.println("Result: " + result);
assertTrue(result instanceof List);
}
context.close();
}
public static interface BankingGateway{
public Object processDeposits(Deposit deposit);
}
}
In Test case I noticed you used SimpleMessagingGateway and Channels directly and what I wanted to make sure you understand the concept of GatewayProxyFactoryBean which is exposed via 'gateway' element allowing you for a complete type-safe POJO way of interacting with Messaging system, so you entire test case is now completely independent from SI API. . . how cool is that? use framework but don't depend on it.