Code
 

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
using System.IO;
 
namespace DynamicDataViewControl
{
    public enum DataSeparator { SingleBreak, DoubleBreack, SingleHorizontalLine, DoubleHorizontalLine }
 
    public partial class DynamicDataView : global::System.Web.UI.UserControl
    {
        #region Properties
 
        private List<string> _rowHeaders = null;
 
        public List<string> RowHeaders
        {
            get { return _rowHeaders; }
            set { _rowHeaders = value; }
        }
 
        private List<string> _columnHeaders = null;
 
        public List<string> ColumnHeaders
        {
            get { return _columnHeaders; }
            set { _columnHeaders = value; }
        }
 
        private int _maximumColumnsInRow = 10;
 
        /// <summary>
        /// Default Value is 10
        /// </summary>
        public int MaximumColumnsInRow
        {
            get { return _maximumColumnsInRow; }
            set { _maximumColumnsInRow = value; }
        }
 
        private DataSeparator _dataDivider = DataSeparator.SingleBreak;
 
        public DataSeparator DataDivider
        {
            get { return _dataDivider; }
            set { _dataDivider = value; }
        }
 
        private string _headerCssClass = string.Empty;
 
        public string HeaderCssClass
        {
            get { return _headerCssClass; }
            set { _headerCssClass = value == null ? string.Empty : value; }
        }
 
        private string _itemCssClass = string.Empty;
 
        public string ItemCssClass
        {
            get { return _itemCssClass; }
            set { _itemCssClass = value == null ? string.Empty : value; }
        }
 
        private string _alternativeItemCssClass = string.Empty;
 
        public string AlternativeItemCssClass
        {
            get { return _alternativeItemCssClass; }
            set { _alternativeItemCssClass = value == null ? string.Empty : value; }
        }
 
        private string _tableCssClass = string.Empty;
 
        public string TableCssClass
        {
            get { return _tableCssClass; }
            set { _tableCssClass = value == null ? string.Empty : value; }
        }
 
        private double _sumOfGrandTotals = 0;
 
        public double SumOfGrandTotals
        {
            get { return _sumOfGrandTotals; }
        }
 
        public bool IsSumOfGrandTotalsShow { get; set; }
 
 
        private Dictionary<string, Dictionary<string, string>> _rowSetDataSource = null;
 
        /// <summary>
        /// <typeparamref name="Represents Dictionary Keys are RowSetHeaderNames and Values are Dictionary.
        /// Values of Dictionary Represents Key as ColumnNames and Value as RowSet Column Data"/>
        /// </summary>
        public Dictionary<string, Dictionary<string, string>> RowSetDataSource
        {
            get { return _rowSetDataSource; }
            set { _rowSetDataSource = value; }
        }
 
        private Dictionary<string, List<string>> _simpleDataSource = null;
 
        /// <summary>
        /// <typeparamref name="Represents Dictionary Simple Data Format that Key as Column Name and Value as Column Value"/>
        /// </summary>
        public Dictionary<string, List<string>> SimpleDataSource
        {
            get { return _simpleDataSource; }
            set { _simpleDataSource = value; }
        }
 
        private bool _isSimpleData = false;
 
        public bool IsSimpleData
        {
            get { return _isSimpleData; }
            set { _isSimpleData = value; }
        }
 
        private bool _isColumnTotals = false;
 
        public bool IsColumnTotals
        {
            get { return _isColumnTotals; }
            set { _isColumnTotals = value; }
        }
 
        private bool _isRowTotals = false;
 
        public bool IsRowTotals
        {
            get { return _isRowTotals; }
            set { _isRowTotals = value; }
        }
 
        private bool _isGrandTotal = false;
 
        public bool IsGrandTotal
        {
            get { return _isGrandTotal; }
            set { _isGrandTotal = value; }
        }
 
        private List<string> _startEndColumnColors = null;
 
        public List<string> StartEndColumnColors
        {
            get { return _startEndColumnColors; }
            set { _startEndColumnColors = value; }
        }
 
        private string _rowHeadersTitle = string.Empty;
 
        public string RowHeadersTitle
        {
            get { return _rowHeadersTitle; }
            set { _rowHeadersTitle = value == null ? string.Empty : value; }
        }
 
        private string _grandTotalTitle = string.Empty;
 
        public string GrandTotalTitle
        {
            get { return _grandTotalTitle; }
            set { _grandTotalTitle = value == null ? string.Empty : value; }
        }
 
        private string _emptyDataText = "No Data To Display";
 
        public string EmptyDataText
        {
            get { return _emptyDataText; }
            set { _emptyDataText = value != null ? value.Length == 0 ? _emptyDataText : value : _emptyDataText; }
        }
 
        #endregion
 
        #region Private Fields
 
        private List<HtmlTable> _dataViewTables = null;
 
        private double _numberOfDataViews = 1;
 
        #endregion
 
        #region Private Functions
 
        public override void DataBind()
        {
            try
            {
                if (!_isSimpleData)
                {
                    CreateHeaderRows();
                    CreateDataRows();
                }
                else
                {
                    CreateSimpleDataTables();
                }
 
                if (_dataViewTables != null)
                {
                    FillTablesInDataContainer();
                }
                else
                {
                    divDataContainer.Controls.Clear();
                    divDataContainer.InnerHtml = _emptyDataText;
                }
            }
            catch (Exception ex)
            {
                divDataContainer.Controls.Clear();
                divDataContainer.InnerHtml = _emptyDataText;
            }
 
        }
 
        private void CreateSimpleDataTables()
        {
            if (_simpleDataSource == null)
            {
                return;
            }
            List<double> columnTotals = new List<double>();
 
            if (_isColumnTotals)
            {
                foreach (var item in _simpleDataSource)
                {
                    columnTotals.Add(item.Value.Sum(delegate(string value) { double ctotal = 0; double.TryParse(value, out ctotal); return ctotal; }));
                }
 
            }
 
            _dataViewTables = new List<HtmlTable>();
 
            _numberOfDataViews = _simpleDataSource.Count < _maximumColumnsInRow ? 1 : Math.Ceiling(Convert.ToDouble(_simpleDataSource.Count) / _maximumColumnsInRow);
 
            int position = 0;
 
 
 
            for (int i = 1; i <= _numberOfDataViews; i++)
            {
                HtmlTable htable = new HtmlTable();
 
                HtmlTableRow hrow = new HtmlTableRow();
 
                htable.Rows.Add(hrow);
 
                int currentlength = (i * _maximumColumnsInRow) < _simpleDataSource.Count ? (i * _maximumColumnsInRow) - position : _simpleDataSource.Count - ((i - 1) * _maximumColumnsInRow);
 
                int maximumCellsInColumn = 0;
 
                int index = -1;
 
                maximumCellsInColumn = _simpleDataSource.ToList().FindAll(delegate(KeyValuePair<string, List<string>> item) { index++; return (index >= position && index < currentlength + position); }).Max(item => item.Value.Count);
 
 
                for (int j = position; j < currentlength + position; j++)
                {
                    HtmlTableCell headerCell = new HtmlTableCell();
 
                    headerCell.Attributes.Add("class", _headerCssClass);
 
                    headerCell.InnerHtml = _simpleDataSource.ElementAt(j).Key;
 
                    string cssClass = "";
 
 
                    for (int z = 0; z < maximumCellsInColumn; z++)
                    {
                        HtmlTableRow dataRow = new HtmlTableRow();
 
 
                        if (j == position)
                        {
                            htable.Rows.Add(new HtmlTableRow());
                            dataRow = htable.Rows[htable.Rows.Count - 1];
                        }
                        else
                        {
                            try
                            {
                                dataRow = htable.Rows[z + 1];
                            }
                            catch
                            { }
                        }
 
                        if ((z % 2) == 0)
                        {
                            cssClass = _alternativeItemCssClass;
                        }
                        else
                        {
                            cssClass = _itemCssClass;
                        }
 
                        HtmlTableCell dataCell = new HtmlTableCell();
 
                        dataCell.Attributes.Add("class", cssClass);
 
                        dataCell.InnerHtml = _simpleDataSource.ElementAt(j).Value.Count > z ? _simpleDataSource.ElementAt(j).Value[z] : "";
 
                        dataRow.Cells.Add(dataCell);
 
                    }
 
 
                    hrow.Cells.Add(headerCell);
                }
 
 
                htable.Attributes.Add("class", _tableCssClass);
 
 
                if (_isColumnTotals)
                {
                    HtmlTableRow totalRow = new HtmlTableRow();
 
                    for (int j = position; j < currentlength + position; j++)
                    {
                        HtmlTableCell totalCell = new HtmlTableCell();
 
                        totalCell.Attributes.Add("class", _headerCssClass);
 
                        totalCell.InnerHtml = columnTotals[j].ToString();
 
                        totalRow.Cells.Add(totalCell);
 
                        htable.Rows.Add(totalRow);
                    }
 
                }
 
                _dataViewTables.Add(htable);
 
                position += currentlength;
            }
 
        }
 
        private void SetColumnTotals()
        {
            if (_isColumnTotals)
            {
                Dictionary<string, string> totalsRow = new Dictionary<string, string>();
 
                foreach (var item in _columnHeaders)
                {
                    double total = 0;
 
                    // total = _dataSource.Sum(currentItem => currentItem.Value.ContainsKey(item) ? double.Parse(currentItem.Value[item].ToString()) : 0.0);
                    total = _rowSetDataSource.Sum(delegate(KeyValuePair<string, Dictionary<string, string>> currentItem) { double currentValue = 0; double.TryParse(currentItem.Value[item].ToString(), out currentValue); return currentValue; });
 
                    totalsRow.Add(item, total.ToString());
                }
 
                _rowSetDataSource.Add("Totals", totalsRow);
            }
        }
 
        private void CreateHeaderRows()
        {
            if (_columnHeaders == null)
            {
                return;
            }
 
            _dataViewTables = new List<HtmlTable>();
 
            _numberOfDataViews = _columnHeaders.Count < _maximumColumnsInRow ? 1 : Math.Ceiling(Convert.ToDouble(_columnHeaders.Count) / _maximumColumnsInRow);
 
            int position = 0;
 
            for (int i = 1; i <= _numberOfDataViews; i++)
            {
                HtmlTable htable = new HtmlTable();
 
                HtmlTableRow hrow = new HtmlTableRow();
 
                HtmlTableCell dataCell = new HtmlTableCell();
 
                dataCell.Attributes.Add("class", _headerCssClass);
 
                dataCell.InnerHtml = _rowHeadersTitle;
 
                hrow.Cells.Add(dataCell);
 
                int currentlength = (i * _maximumColumnsInRow) < _columnHeaders.Count ? (i * _maximumColumnsInRow) - position : _columnHeaders.Count - ((i - 1) * _maximumColumnsInRow);
 
                for (int j = position; j < currentlength + position; j++)
                {
                    HtmlTableCell currentCell = new HtmlTableCell();
 
                    currentCell.Attributes.Add("class", _headerCssClass);
 
                    currentCell.InnerHtml = _columnHeaders[j];
 
                    hrow.Cells.Add(currentCell);
                }
 
                if (_isRowTotals)
                {
                    HtmlTableCell currentCell = new HtmlTableCell();
 
                    currentCell.Attributes.Add("class", _headerCssClass);
 
                    currentCell.InnerHtml = "Total";
 
                    hrow.Cells.Add(currentCell);
                }
 
                htable.Rows.Add(hrow);
 
                htable.Attributes.Add("class", _tableCssClass);
 
                _dataViewTables.Add(htable);
 
                position += currentlength;
            }
        }
 
        private void CreateDataRows()
        {
            if (_rowHeaders == null || _rowSetDataSource == null)
            {
                for (int i = 0; i < _numberOfDataViews; i++)
                {
                    HtmlTableRow emptyDataRow = new HtmlTableRow();
 
                    emptyDataRow.Cells.Add(new HtmlTableCell()
                    {
                        ColSpan = _dataViewTables[i].Rows[0].Cells.Count,
                        InnerHtml = _emptyDataText
                    }
                                           );
 
                    emptyDataRow.Attributes.Add("class", _itemCssClass);
                    _dataViewTables[i].Rows.Add(emptyDataRow);
                }
                return;
            }
            if (_isColumnTotals)
            {
                SetColumnTotals();
            }
 
            int dataColumnPosition = 0;
 
            List<double> allColumnTotalsInRow = new List<double>();
 
            for (int i = 0; i < _numberOfDataViews; i++)
            {
                int dataRowPosition = 1;
 
                HtmlTableRow columnTotalsRow = new HtmlTableRow();
 
                if (_isColumnTotals)
                {
                    columnTotalsRow.Cells.Add(new HtmlTableCell() { InnerHtml = "Total" });
                    columnTotalsRow.Cells[0].Attributes.Add("class", _headerCssClass);
                }
 
                int currentTableColumns = _dataViewTables[i].Rows[0].Cells.Count - 1;
 
                currentTableColumns -= _isRowTotals ? 1 : 0;
 
                foreach (var item in _rowHeaders)
                {
                    HtmlTableRow rowHeader = new HtmlTableRow();
 
                    HtmlTableCell rowHeaderCell = new HtmlTableCell();
 
                    string cssClass = "";
 
                    if (dataRowPosition % 2 == 0)
                    {
                        cssClass = _itemCssClass;
                    }
                    else
                    {
                        cssClass = _alternativeItemCssClass;
                    }
 
                    rowHeaderCell.Attributes.Add("class", cssClass);
 
                    rowHeaderCell.InnerHtml = item;
 
                    rowHeader.Cells.Add(rowHeaderCell);
 
                    double rowTotal = 0;
 
                    for (int j = dataColumnPosition; j < dataColumnPosition + currentTableColumns; j++)
                    {
                        HtmlTableCell dataCell = new HtmlTableCell();
 
                        dataCell.Attributes.Add("class", cssClass);
 
                        dataCell.Attributes.CssStyle.Add("text-align", "center");
 
                        if (_startEndColumnColors != null)
                        {
                            if (j == 0 || j == _columnHeaders.Count - 1)
                            {
                                dataCell.Attributes.CssStyle.Add("background-color", _startEndColumnColors[dataRowPosition - 1]);
                                dataCell.Attributes.CssStyle.Add("color", "#ffffff");
                            }
                        }
 
                        if (_rowSetDataSource[item].ContainsKey(_columnHeaders[j]))
                        {
                            dataCell.InnerHtml = _rowSetDataSource[item][_columnHeaders[j]];
 
                            double currentValue = 0;
                            double.TryParse(_rowSetDataSource[item][_columnHeaders[j]], out currentValue);
 
                            rowTotal += currentValue;
 
                            if (_isColumnTotals && dataRowPosition == 1)
                            {
                                HtmlTableCell totalCell = new HtmlTableCell();
                                totalCell.Attributes.Add("class", _headerCssClass);
                                totalCell.InnerHtml = _rowSetDataSource["Totals"][_columnHeaders[j]];
                                columnTotalsRow.Cells.Add(totalCell);
                            }
                        }
                        else
                        {
                            dataCell.InnerHtml = "  ";
                        }
 
                        rowHeader.Cells.Add(dataCell);
                    }
                    if (_isGrandTotal)
                    {
                        if (i == 0)
                        {
                            allColumnTotalsInRow.Add(rowTotal);
                        }
                        else
                        {
                            allColumnTotalsInRow[dataRowPosition - 1] += rowTotal;
                        }
                    }
 
                    dataRowPosition++;
 
                    if (_isRowTotals)
                    {
                        HtmlTableCell totalCell = new HtmlTableCell();
                        totalCell.Attributes.Add("class", cssClass);
                        totalCell.Attributes.CssStyle.Add("text-align", "center");
                        totalCell.InnerHtml = string.Format("<b>{0}</b>", rowTotal.ToString());
                        rowHeader.Cells.Add(totalCell);
                    }
 
                    _dataViewTables[i].Rows.Add(rowHeader);
                }
 
                if (_isRowTotals)
                {
                    HtmlTableCell totalCell = new HtmlTableCell();
                    totalCell.Attributes.Add("class", _headerCssClass);
                    totalCell.InnerHtml = "";
                    columnTotalsRow.Cells.Add(totalCell);
                }
 
                _dataViewTables[i].Rows.Add(columnTotalsRow);
 
                dataColumnPosition += currentTableColumns;
 
                #region Grand Total
 
                if (i == _numberOfDataViews - 1)
                {
                    if (_isGrandTotal)
                    {
                        HtmlTableCell grandTotalCell = new HtmlTableCell();
                        grandTotalCell.Attributes.Add("class", _headerCssClass);
                        grandTotalCell.InnerHtml = _grandTotalTitle.Trim().Length == 0 ? "Grand Total" : _grandTotalTitle;
                        _dataViewTables[i].Rows[0].Cells.Add(grandTotalCell);
 
                        for (int x = 1; x <= _rowHeaders.Count; x++)
                        {
                            grandTotalCell = new HtmlTableCell();
                            grandTotalCell.Attributes.Add("class", _headerCssClass);
                            grandTotalCell.InnerHtml = allColumnTotalsInRow[x - 1].ToString();
                            _dataViewTables[i].Rows[x].Cells.Add(grandTotalCell);
                        }
 
                        grandTotalCell = new HtmlTableCell();
                        grandTotalCell.Attributes.Add("class", _headerCssClass);
                        grandTotalCell.InnerHtml = "";
 
                        _sumOfGrandTotals = allColumnTotalsInRow.Sum();
 
                        if (IsSumOfGrandTotalsShow)
                        {
                            grandTotalCell.InnerHtml = _sumOfGrandTotals.ToString();
                        }
 
                        _dataViewTables[i].Rows[_dataViewTables[i].Rows.Count - 1].Cells.Add(grandTotalCell);
 
                    }
                }
 
                #endregion
            }
 
        }
 
        private void FillTablesInDataContainer()
        {
            int i = 0;
            divDataContainer.Controls.Clear();
            foreach (var item in _dataViewTables)
            {
                divDataContainer.Controls.Add(item);
 
                i++;
 
                if (_dataViewTables.Count > 1 && i != _dataViewTables.Count)
                {
                    divDataContainer.Controls.Add(GetDataDivider());
                }
 
            }
 
            //  Session["_dataViewTables"] = _dataViewTables;
        }
 
        private HtmlGenericControl GetDataDivider()
        {
            HtmlGenericControl hgControl = new HtmlGenericControl();
 
            switch (_dataDivider)
            {
                case DataSeparator.SingleBreak:
                    hgControl.InnerHtml = "<br />";
                    break;
                case DataSeparator.DoubleBreack:
                    hgControl.InnerHtml = "<br /> <br />";
                    break;
                case DataSeparator.SingleHorizontalLine:
                    hgControl.InnerHtml = "<hr style=\"display :block; width:100%;\" />";
                    break;
                case DataSeparator.DoubleHorizontalLine:
                    hgControl.InnerHtml = "<hr style=\"display :block;width:100%;float:left;\"/><hr style=\"display :block;width:100%;float:left;\"/>";
                    break;
            }
 
            return hgControl;
        }
 
        #endregion
    }
}

Markup :
JavaScript
 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DynamicDataView.ascx.cs"
    Inherits="DynamicDataViewControl" %>
 
<div id="divDataContainer" runat="server" style="width: 100%; height: 100%; float: left;">
    <span>Dynamic DataView Control</span>
</div>