I would start by adding std::initializer_list support to internal::plain_array and DenseStorage. Both are located in src/Core/DenseStorage.h. There are several specializations for heap and stack objects and you have to add support to all of them.
Once you have support in DenseStorage, you need to add the constructors to Array, Matrix and PlainObjectBase. PlainObjectBase is the class which owns the DenseStorage. I think only the constructors in DenseStorage, Array and Matrix need to be public. The others should probably be protected since they are not intended for public use. (I just recognized that I made the move constructor/assignment public, I probably should change that too).
Then there is one issue left which is discussed here: http://stackoverflow.com/questions/17803475/why-is-stdinitializer-list-often-passed-by-value
. Passing by value relies on the compiler performing copy elision and the original article (Want Speed? Pass by Value..
) states that if no elision is performed you are loosing nothing. As I see it, this is true if the class hierarchy is flat and makes sense if the type T being stored in the Matrix/Array is movable. In our case, we are passing the std::initializer_list from Matrix to PlainObjectBase to DenseStorage and maybe even further to internal::plain_array. That means if no copy elision is performed we are copying up to 3 times. Therefore, I would suggest to actually pass by const reference in our case.
If any of the specialists on the list object to what I have written in the last paragraph, please let us know.