Atmel AVR XMEGA-A USART MPCM (Multiprocessor communication mode) configuration with ASF 3.33
I've spent a few hours on the problem, and fortunately it works now with one master and two slaves. It doesn't use DMA because I think it is impractical in this case, so I decided to use interrupts instead.
First I changed the USART's format to 9 bits, so the initialization method starts like this:

static usart_serial_options_t usart_options = {
    .baudrate = 1200;
    .charlength = USART_CHSIZE_9BIT_gc,
    .paritytype = USART_PMODE_ODD_gc,
    .stopbits = false
};


And I changed the interrupt level at its end:

usart_set_rx_interrupt_level(USART_SERIAL, USART_RXCINTLVL_OFF_gc);
usart_set_tx_interrupt_level(USART_SERIAL, USART_TXCINTLVL_MED_gc);


Then I defined two methods to replace the usart_serial_putchar(&amp;USARTC0, buffer[i]) and usart_serial_getchar(&amp;USARTC0, &amp;buffer[i]) methods:

static void usart_send_mpcm_data(usart_if usart, uint8_t data, bool is_address)
{
    /* Wait until we are ready to send the next 9 bits */
    while (usart_data_register_is_empty(usart) == false) {}

    /* First we need to set the 9. bit of the frame, which is the indicator for the address frame */
    if (is_address)
    {
        (usart)-&gt;CTRLB |= USART_TXB8_bm;
    } else
    {
        (usart)-&gt;CTRLB &amp;= ~USART_TXB8_bm;
    }

    /* Second, let's load the 8-bit data into the DATA register of the USART */
    (usart)-&gt;DATA = data;
}


static bool usart_receive_mpcm_data(usart_if usart, uint8_t* data, uint8_t my_address)
{
    bool result = false;

    /* Are we in MPCM mode? */
    bool MPCM_mode = usart-&gt;CTRLB &amp; USART_MPCM_bm;
    /* Is this an address frame? */
    bool address_frame = usart-&gt;STATUS &amp; USART_RXB8_bm;

    /* Read char, clearing RXCIF */
    uint8_t read_data = usart-&gt;DATA;

    if ((!MPCM_mode) &amp;&amp; (!address_frame))
    {
        /* This is a data frame, and we are interested in it */
        *data = read_data;
        result = true;
    }

    if (address_frame)
    {
        /* This frame is an address frame, so let's check if it addresses us (my_address) or broadcasts (0) */
        MPCM_mode = !((read_data == my_address) || (read_data == 0));
    }

    /* Set the MPCM bit in the USART's control register */
    if (MPCM_mode)
    {
        usart-&gt;CTRLB |= USART_MPCM_bm;
    } else
    {
        usart-&gt;CTRLB &amp;= ~USART_MPCM_bm;
    }

    /* Return true if we read some useful data */
    return result;
}


After having these, I could setup the interrupt method on the slaves:

// USART-C Reception Complete Interrupt
ISR(USARTC0_RXC_vect)
{
    if (usart_receive_mpcm_data(&amp;USARTC0, &amp;usart_destination[usart_interrupt_counter], settings.device_index))
    {
        usart_interrupt_counter = (usart_interrupt_counter+1) % DMA_BUFFER_SIZE;
        rx_counter += 1;    
    }
}


On the master I can use the usart_send_mpcm_data(&amp;USARTC0, usart_source[i], false); method to send data, or usart_send_mpcm_data(&amp;USARTC0, slave_address, true); to change the target slave address. If the address is 0, then that's going to be a broadcast message, so all slaves will receive the data.