Options set in dynamic multiple select field with ajax are not preserved
You can refer the following example for creating Dependent select list 

function multiselect_field_widget_form(&amp;$form, &amp;$form_state, $field, $instance, $langcode, $items, $delta, $element) {
    $options_first = multiselect_first_dropdown_options();
    $value_dropdown_first = isset($form_state['values']['dropdown_first']) ? $form_state['values']['dropdown_first'] : key($options_first);

    $form['dropdown_first'] = array(
        '#type' =&gt; 'select',
        '#multiple' =&gt; TRUE,
        '#title' =&gt; 'First Dropdown',
        '#options' =&gt; $options_first,
        '#default_value' =&gt; $value_dropdown_first,
        '#ajax' =&gt; array(
            'event' =&gt; 'change',
            'callback' =&gt; 'multiselect_school_ajax_callback',
            'wrapper' =&gt; 'dropdown_second_replace',
        ),
    );
    $form['wrapper'] = array(
        '#prefix'  =&gt; '&lt;div id="dropdown_second_replace"&gt;',
        '#suffix'  =&gt; '&lt;/div&gt;',
    );
    if(!empty($form_state['values']['dropdown_first'])){
        // Code here or call function for  fetching value second and third dropdown
    }
    $form ['wrapper']['dropdown_second'] = array(
        '#type' =&gt; 'select',
        '#multiple' =&gt; TRUE,
        '#title' =&gt; 'Second Dropdown',
        '#prefix' =&gt; '&lt;div id="dropdown_second_replace"&gt;',
        '#suffix' =&gt; '&lt;/div&gt;',
        '#options' =&gt; multiselect_second_dropdown_options($value_dropdown_first),
        '#default_value' =&gt; isset($form_state['values']['dropdown_second']) ? $form_state['values']['dropdown_second'] : '',

        '#ajax' =&gt; array(
            'event' =&gt; 'change',
            'callback' =&gt; 'multiselect_class_ajax_callback',
            'wrapper' =&gt; 'dropdown_assignment_replace',
        ),
    );
    $form['wrapper']['dropdown_assignment'] = array(
        '#type' =&gt; 'select',
        '#multiple' =&gt; TRUE,
        '#title' =&gt; 'Second Dropdown',
        '#prefix' =&gt; '&lt;div id="dropdown_assignment_replace"&gt;',
        '#suffix' =&gt; '&lt;/div&gt;',
        '#options' =&gt; multiselect_second_dropdown_options($value_dropdown_first),
        '#default_value' =&gt; isset($form_state['values']['dropdown_second']) ? $form_state['values']['dropdown_second'] : '',
    );
    return $form;
}


The basic idea about above example is that use wrapper as a div which will have your second and third dropdown so on change of first drop down form state will be set so it will go into if condition than that will give you the value for the secoond and third drop down